# LeetCode 199、二叉树的右视图
# 一、题目描述
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
# 二、题目解析
# 三、参考代码
# 1、Java 代码
// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
// 作者:程序员吴师兄
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
// 二叉树的右视图( LeetCode 199 ): https://leetcode-cn.com/problems/binary-tree-right-side-view/
class Solution {
public List<Integer> rightSideView(TreeNode root) {
// 设置一个数组用来存储二叉树的右视图结果
// 题目要求存储的是节点的值,所以类型是 Integer
List<Integer> list = new LinkedList<>();
// 设置一个队列,用来保存二叉树每一层的节点
Queue<TreeNode> que = new LinkedList<>();
// 边界判断
if (root == null) return list;
// 首先,把二叉树的根节点加入到队列中
que.add(root);
// 观察队列是否为空
while (!que.isEmpty()) {
// 1、获取队列的长度
int levelSize = que.size();
// 2、通过一个循环,获取队列中每个节点的左右子树,把这些左右子树节点也添加到队列中
for (int i = 0; i < levelSize; i++) {
// 3、弹出队列的队首元素
TreeNode node = que.poll();
// 4、判断弹出的节点是否有左子树
if (node.left != null) {
// 如果有左子树,把它加入到队列中
que.add(node.left);
}
// 5、判断弹出的节点是否有右子树
if (node.right != null) {
// 如果有右子树,把它加入到队列中
que.add(node.right);
}
// 对于每一层的二叉树节点,我们是从左到右依次添加,所以末尾的节点的顺序是 levelSize - 1
// 6、这个末尾的节点就是这一层中最右侧的节点
if (i == levelSize - 1) {
// 把最右侧的节点值加入到结果中
list.add(node.val);
}
}
}
// 返回结果
return list;
}
}
# **2、**C++ 代码
// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
// 作者:程序员吴师兄
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
// 二叉树的右视图( LeetCode 199 ): https://leetcode-cn.com/problems/binary-tree-right-side-view/
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
// 设置一个数组用来存储二叉树的右视图结果
// 题目要求存储的是节点的值,所以类型是 Integer
vector<int> list;
// 设置一个队列,用来保存二叉树每一层的节点
queue<TreeNode*> que;
// 边界判断
if (root == NULL) return list;
// 首先,把二叉树的根节点加入到队列中
que.push(root);
// 观察队列是否为空
while (!que.empty()) {
// 1、获取队列的长度
int levelSize = que.size();
// 2、通过一个循环,获取队列中每个节点的左右子树,把这些左右子树节点也添加到队列中
for (int i = 0; i < levelSize; i++) {
// 3、弹出队列的队首元素
TreeNode* node = que.front();
que.pop();
// 4、判断弹出的节点是否有左子树
if (node->left != NULL) {
// 如果有左子树,把它加入到队列中
que.push(node->left);
}
// 5、判断弹出的节点是否有右子树
if (node->right != NULL) {
// 如果有右子树,把它加入到队列中
que.push(node->right);
}
// 对于每一层的二叉树节点,我们是从左到右依次添加,所以末尾的节点的顺序是 levelSize - 1
// 6、这个末尾的节点就是这一层中最右侧的节点
if (i == levelSize - 1) {
// 把最右侧的节点值加入到结果中
list.push_back(node->val);
}
}
}
// 返回结果
return list;
}
};
# 3、Python 代码
登录 AlgoMooc 官网获取更多算法图解
# https://www.algomooc.com
# 作者:程序员吴师兄
# 代码有看不懂的地方一定要私聊咨询吴师兄呀
# 二叉树的右视图( LeetCode 199 ): https://leetcode-cn.com/problems/binary-tree-right-side-view/
class Solution:
def rightSideView(self, root: TreeNode) -> List[int]:
# 设置一个数组用来存储二叉树的右视图结果
# 题目要求存储的是节点的值,所以类型是 Integer
list = []
# 设置一个队列,用来保存二叉树每一层的节点
que = deque()
# 边界判断
if not root :
return list
# 首先,把二叉树的根节点加入到队列中
que.append(root)
# 观察队列是否为空
while que:
# 1、获取队列的长度
levelSize = len(que)
# 2、通过一个循环,获取队列中每个节点的左右子树,把这些左右子树节点也添加到队列中
for i in range(levelSize):
# 3、弹出队列的队首元素
node = que.popleft()
# 4、判断弹出的节点是否有左子树
if node.left :
# 如果有左子树,把它加入到队列中
que.append(node.left)
# 5、判断弹出的节点是否有右子树
if node.right :
# 如果有右子树,把它加入到队列中
que.append(node.right)
# 对于每一层的二叉树节点,我们是从左到右依次添加,所以末尾的节点的顺序是 levelSize - 1
# 6、这个末尾的节点就是这一层中最右侧的节点
if i == levelSize - 1 :
# 把最右侧的节点值加入到结果中
list.append(node.val)
# 返回结果
return list